package com.wl2o2o.designpatterns.singleton;

/**
 * @Author <a href="https://github.com/wl2o2o">程序员CSGUIDER</a>
 * @From <a href="https://wl2o2o.github.io">CSGUIDER博客</a>
 * @CreateTime 2024/3/12
 */

import java.util.Scanner;

/**
 * 题目描述：
 * 【设计模式专题之单例模式】1.小明的购物车
 * 时间限制：1.000S  空间限制：256MB
 * 题目描述
 * 小明去了一家大型商场，拿到了一个购物车，并开始购物。请你设计一个购物车管理器，记录商品添加到购物车的信息（商品名称和购买数量），
 * 并在购买结束后打印出商品清单。（在整个购物过程中，小明只有一个购物车实例存在）。
 * 输入描述
 * 输入包含若干行，每行包含两部分信息，分别是商品名称和购买数量。商品名称和购买数量之间用空格隔开。
 * 输出描述
 * 输出包含小明购物车中的所有商品及其购买数量。每行输出一种商品的信息，格式为 "商品名称 购买数量"。
 * 输入示例
 * Apple 3
 * Banana 2
 * Orange 5
 * 输出示例
 * Apple 3
 * Banana 2
 * Orange 5
 * 提示信息
 * 本道题目请使用单例设计模式：
 * 使用私有静态变量来保存购物车实例。
 * 使用私有构造函数防止外部直接实例化。
 */
public class LazySingleton {
    private static LazySingleton instance = null;
    // 请你设计一个购物车管理器，记录商品添加到购物车的信息（商品名称和购买数量）
    private String name;
    private int count;
    // 使用私有构造函数防止外部直接实例化。
    private LazySingleton(String name, int count) {
        this.name = name;
        this.count = count;
    }
    // get和set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    private LazySingleton() {}


    /**
     * 写法一：不加同步锁锁获取单例，多线程情况下会造成重复创建单例
     * @return instance
     */
    // public static LazySingleton getInstance() {
    //     if (instance == null) {
    //         instance = new LazySingleton();
    //     }
    //     return instance;
    // }
    /**
     * 写法二：加同步锁锁获取单例，多线程情况下不会重复创建单例
     * @return instance
     */
    // public static synchronized LazySingleton getInstance() {
    //     if (instance == null) {
    //         instance = new LazySingleton();
    //     }
    //     return instance;
    // }
    /**
     * 写法三：双重校验锁获取单例，多线程情况下不会重复创建单例
     * @return instance
     */
    public static LazySingleton getInstance() {
        if (instance == null) {
            synchronized (LazySingleton.class) {
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }


    public static void LazySingleton(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            String[] line = scanner.nextLine().split(" ");
            LazySingleton.getInstance().setName(line[0]);
            LazySingleton.getInstance().setCount(Integer.parseInt(line[1]));
            System.out.println(LazySingleton.getInstance().getName() + " " + LazySingleton.getInstance().getCount());

        }
    }


}
